// 2025.08.05 00:46:46 星期二 晴 手 不知怎得 又开始有点 疼的迹象了

import { empty_clone } from '../../../../../global/Func/empty_clone';
import { describe_inv_or_rev, rec_empty_obj } from '../Types';
import {
  get_db_relation_cur_meta_id,
  get_relation_describe_inv_or_rev,
} from './get_mdb';

/**
 * 描述符
 */
let cur_db_relation_describe_info: string[];

/**
 * 热更新 当前 描述符 记录值 信息  上行 或 下行
 * @param inv_or_rev
 */
async function renew_cur_db_relation_describe_info(
  inv_or_rev: describe_inv_or_rev
) {
  cur_db_relation_describe_info = await get_relation_describe_inv_or_rev(
    inv_or_rev
  );
}

/**
 * 输出 当前 元素 的 下行 关联表
 * @param target_id
 * @returns
 */
export async function get_relation_json_cur_meta_id_inv(meta_id: string) {
  await renew_cur_db_relation_describe_info('inv');

  return await _get_relation_json_cur_meta_id_inv(meta_id);
}

/**
 * 输出 当前 元素 的 上行 关联表
 * @param target_id
 * @returns
 */
export async function get_relation_json_cur_meta_id_rev(meta_id: string) {
  await renew_cur_db_relation_describe_info('rev');

  return await _get_relation_json_cur_meta_id_rev(meta_id, {
    [meta_id]: meta_id,
  });
}

/**
 * 深度检索
 * @param target_id
 */
async function _get_relation_json_cur_meta_id_inv(target_id: string) {
  let ret: rec_empty_obj = {};

  let mdb_relation_cur_target_id = get_db_relation_cur_meta_id(target_id);

  let find_inv_info_arr = await mdb_relation_cur_target_id
    .find({
      describe: { $in: cur_db_relation_describe_info },
    })
    .toArray();

  /**
   * 无 后继  返回 当前 元素
   */
  if (find_inv_info_arr.length == 0) {
    return target_id;
  }

  for (const find_inv_info_val of find_inv_info_arr) {
    ret[find_inv_info_val.target] = await _get_relation_json_cur_meta_id_inv(
      find_inv_info_val.target
    );
  }

  return ret;
}

/**
 * 深度检索
 * @param target_id
 */
async function _get_relation_json_cur_meta_id_rev(
  target_id: string,
  ret: rec_empty_obj
) {
  return await __get_relation_json_cur_meta_id_rev(target_id, ret);
}

async function __get_relation_json_cur_meta_id_rev(
  target_id: string,
  child_ret: rec_empty_obj | string
) {
  /**
   * 上行层
   */
  let father_father: rec_empty_obj = {};

  let mdb_relation_cur_target_id = get_db_relation_cur_meta_id(target_id);

  let find_inv_info_arr = await mdb_relation_cur_target_id
    .find({
      describe: { $in: cur_db_relation_describe_info },
    })
    .toArray();

  /**
   * 无 上行 返回 当前 元素
   */
  if (find_inv_info_arr.length == 0) {
    return target_id;
  }

  for (const find_inv_info_val of find_inv_info_arr) {
    /**
     * 逻辑 修订
     *
     * 只需要 当前 这一支 信息 结构
     */
    let cur_target_id_info = { [find_inv_info_val.target]: child_ret };

    let father_cur_father = await __get_relation_json_cur_meta_id_rev(
      find_inv_info_val.target,
      cur_target_id_info
    );

    // 没有 上行
    if (typeof father_cur_father == 'string') {
      father_father[find_inv_info_val.target] = child_ret;

      continue;
    }

    Object.assign(father_father, father_cur_father);
  }

  return father_father;
}
